<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<script>
// 箭头函数
// 语法：(形参) => {函数体}
// 箭头函数主要用于匿名函数的地方

// 箭头函数的简写：
// 1.只有一个形参时，可以省略小括号
// 2.函数体只有一条语句时，可以省略大括号
// 3.函数体中只有一条return语句时，可以省略大括号和return

// 箭头函数和普通函数的一些区别：
// 1.箭头函数没有函数声明的形式
// 2.箭头函数内部没有this关键字，使用的是函数外部的this
// 3.不能修改箭头函数内部的this指向
// 4.箭头函数不能作为构造函数（不能new调用）
// 5.箭头函数没有prototype属性
// 6.箭头函数内部没有arguments关键字


// 解构赋值
// 解析数据结构，并对变量进行赋值
// 通常是对 对象或数组 进行解构赋值
// let {a,c,b} = {a:1,b:2,c:3};
// let [a,b,c] = [1,2,3];
// function fn1({name,age,sex}){}
// fn1({name:'zs',age:23,sex:'nv'});
// function fn2([a,b,c]){}
// fn2([1,2,3]);


// 默认值
// let {a,c,b,d=4} = {a:1,b:2,c:3};
// let [a,b,c,d=4] = [1,2,3];
// function fn1({name,age,sex='nan'}){}
// fn1({name:'zs',age:23,sex:'nv'});
// function fn2([a=1,b=1,c=1]){}
// fn2([1,2,3]);
// function fn3(x=1,y=1){}
// fn3();


// includes(val,index)用于查询数组中是否包含某个值，返回布尔值
// includes(val,index)用于查询字符串中是否包含某个值，返回布尔值

// startsWith(val)判断字符串开头是否为val
// endsWith(val)判断字符串结尾是否为val

// findIndex(()=>{})查找某个值在数组中第一次出现的索引，没有返回-1

// Array.from()将类数组对象、伪数组转成真正的数组


// 三个点 ...
// ... 作为扩展运算符，可以将 字符串、数组、类数组(元素集合、arguments)、Set、Map 等数据展开为逗号隔开的参数序列 a,b,c,d
// console.log( ...[1,2,3] );// 1,2,3

// ... 作为rest运算符，将剩余的数据收集起来
// let [a,b,...c] = [1,2,3,4,5];// c = [3,4,5]
// let {a,b,...c} = {a:1,b:2,c:3,d:4};// c = {c:3,d:4}
// function fn4(...arr){
//     console.log( arr );// [2,3,4,5]
// }
// fn4(2,3,4,5)


// Set 新的数据结构
// Set类似数组，成员是唯一的，会自动去重
// let s1 = new Set([1,2,3,4]);
// s1.size 元素个数
// s1.add(val)添加一个值
// s1.delete(val)删除一个值
// s1.has(val)判断是否包含某值
// s1.clear()清空所有值
// 遍历Set数据：
// s1.forEach((item)=>{})
// for(let val of s1){}


// Map 新的数据结构
// Map类似对象，是一种更纯粹的键值对数据结构
// let m1 = new Map([['name','张三'],['age',23],['sex','女']]);
// m1.size 键值对的个数
// m1.set(key,val)添加/修改某个键值对
// m1.delete(key)删除一个键值对
// m1.get(key)查询某个key的值
// m1.clear()清空所有值

// 遍历Map数据：
// m1.forEach((val,key)=>{})
// for (let a of m1){}  a = ['name','张三']
// for (let [k,v] of m1){}  k ='name'  v = '张三'


// Symbol 新的数据类型
// Symbol表示独一无二的值(唯一)
let s1 = Symbol();
let s2 = Symbol();
let s3 = Symbol('age');
let s4 = Symbol('age');
console.log( typeof s1 );// 'symbol'
console.log( s1 === s2 );// false
console.log( s3 === s4 );// false

// Symbol主要用作对象的属性名
// 1.避免属性重名，发生覆盖
// 2.可以保护对象的属性，不会被正常的操作访问到
let obj = {
    name: '李四',
    sex: '女',
    [Symbol('age')]: 28
}
console.log( obj.name );// '李四'
console.log( obj[Symbol('age')] );// undefined

let arr = Object.getOwnPropertySymbols(obj);
console.log( arr );// [Symbol(age)]
console.log( obj[arr[0]] );// 28

console.log( Symbol.iterator );// Symbol(Symbol.iterator)
Symbol.iterator = Symbol('Symbol.iterator')


</script>
</body>
</html>